package main

import "fmt"

/*
1.接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量
2.只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型
3.一个自定义类型可以实现多个接口
4.一个接口(比如A接口)可以继承多个别的接口(比如B,C接口),这时如果要实现A接口,也必须将B,C接口的方法全部实现
5.interface类型默认是一个指针(引用类型),如果没有对interface初始化就使用那么会输出nil
6.空接口没有任何方法,所以可以认为所有类型都实现了空接口,也可以理解为我们可以把任何一个变量赋值给空接口
*/

type E interface {
}

type A interface {
	//A 接口继承 B 和 C
	B
	C
	a()
}

type B interface {
	b()
}

type C interface {
	c()
}

type Per struct {
}

func (s Per) c() {
	fmt.Println("实现了C接口")
}

func (s Per) b() {
	fmt.Println("实现了B接口")
}

func (s Per) a() {
	fmt.Println("实现了A接口")
}

func main() {
	var s Per
	var a A = s
	a.a()
	a.b()
	a.c()

	fmt.Println("---------------- ---------------- ----------------")

	var e E = s
	fmt.Println(e)

	fmt.Println("---------------- ---------------- ----------------")

	var num float32 = 9.3
	var e2 E = num
	fmt.Println(e2)

	fmt.Println("---------------- ---------------- ----------------")

	//匿名空接口
	var e3 interface{} = num
	fmt.Println(e3)

}
